package br.com.ava.view;

import java.io.IOException;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.infra.mensagem.Mensagem;
import br.com.ava.core.infra.mensagem.MensagemConverter;

@ManagedBean
public abstract class AplicacaoMB {

	protected boolean perfilAdministrador;

	public AplicacaoMB() {
		super();
		configuraPerfilAdministrador();
	}

	private void adicionarMensagem(Severity severidade, String titulo,
			String detalhe) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severidade, titulo, detalhe));
	}

	public void adicionarMensagemErro(String mensagem, String detalhe) {
		adicionarMensagem(FacesMessage.SEVERITY_ERROR, mensagem, detalhe);
	}

	public void adicionarMensagemErro(List<Mensagem> mensagens) {

		for (Mensagem mensagem : mensagens) {
			adicionarMensagem(FacesMessage.SEVERITY_ERROR, MensagemConverter
					.getInstance().getAsString(mensagem), null);
		}
	}

	public void adicionarMensagemCadastroSucesso() {
		adicionarMensagem(
				FacesMessage.SEVERITY_INFO,
				MensagemConverter
						.getInstance()
						.getAsString(
								new Mensagem(
										ConstantesMensagens.MSG_SUCESSO_CADASTRO_SUCESSO)),
				null);
	}

	public void adicionarMensagemErroPermissao() {
		adicionarMensagem(
				FacesMessage.SEVERITY_ERROR,
				MensagemConverter.getInstance().getAsString(
						new Mensagem(
								ConstantesMensagens.MSG_ERRO_PERFIL_INVALIDO)),
				null);
	}

	public void adicionarMensagemExclusaoSucesso() {
		adicionarMensagem(
				FacesMessage.SEVERITY_INFO,
				MensagemConverter
						.getInstance()
						.getAsString(
								new Mensagem(
										ConstantesMensagens.MSG_SUCESSO_EXCLUSAO_SUCESSO)),
				null);
	}

	protected void validarPermissao() {
		String perfil = (String) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("perfil");
		if (perfil == null
				|| (!"administrador".equals(perfil) && "administrador"
						.equals(perfilPagina()))) {
			adicionarMensagemErroPermissao();
			try {
				FacesContext.getCurrentInstance().getExternalContext()
						.redirect("../../login.jsf");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	protected Integer obterIdFuncionarioLogado() {
		return (Integer) FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get("idFuncionario");
	}

	protected void configuraPerfilAdministrador() {
		perfilAdministrador = false;

		String perfil = (String) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("perfil");

		if (perfil != null && "administrador".equals(perfil)) {
			perfilAdministrador = true;
		}

	}

	public boolean isPerfilAdministrador() {
		return perfilAdministrador;
	}

	public boolean getPerfilAdministrador() {
		return perfilAdministrador;
	}

	public void setPerfilAdministrador(boolean perfilAdministrador) {
		this.perfilAdministrador = perfilAdministrador;
	}

	public abstract String perfilPagina();

}
